#include "netclient.h"
#include "../model/datacenter.h"
#include "../debug.h"

#include <QNetworkReply>

network::NetClient::NetClient(model::DataCenter *dataCenter)
{
#if TEST_NETWORK_INITWEBSOCKET
    // 暂时在此处初始化websocketClient
    // 后面放到 MainWidget 初始化的时候
    initWebsocket();
#endif
}

/////////////////////////////////////////////////////////////////////////////////
/// 下列逻辑都是 Http 相关的操作
/////////////////////////////////////////////////////////////////////////////////

void network::NetClient::ping()
{
    // 创建HTTP请求并设置请求URL
    QNetworkRequest httpReq;
    httpReq.setUrl(QUrl(HTTP_URL + "/ping"));

    // 使用HTTP客户端对象发送get请求，并接收HTTP响应
    // 需要注意的地方：使用get/post发送请求的时候，会立即发送请求
    //              但是HTTP响应不一定是有效对象，因为网络收发会有延迟
    //              因此需要通过信号槽机制来完成响应内容的设置
    QNetworkReply* httpResp = httpClient.get(httpReq);
    connect(httpResp, &QNetworkReply::finished, this, [=]() {
        // 这里面, 说明响应已经回来了.
        if (httpResp->error() != QNetworkReply::NoError)
        {
            // 请求失败!
            LOG() << "HTTP 请求失败! " << httpResp->errorString();
            httpResp->deleteLater();
            return;
        }

        // 获取到响应的 body
        QByteArray body = httpResp->readAll();
        LOG() << "响应内容: " << body;
        httpResp->deleteLater();
    });
}

/////////////////////////////////////////////////////////////////////////////////
/// 下列逻辑都是 Websocket 相关的操作
/////////////////////////////////////////////////////////////////////////////////

void network::NetClient::initWebsocket()
{
    // 准备好所有需要的信号槽
    // 1. 处理连接建立
    connect(&websocketClient, &QWebSocket::connected, this, [=]() {
        LOG() << "websocket 连接成功!";
        // 不要忘记! 在 websocket 连接成功之后, 发送身份认证消息!
        sendAuth();
    });

    // 2. 处理连接断开
    connect(&websocketClient, &QWebSocket::disconnected, this, [=]() {
        LOG() << "websocket 连接断开!";
    });

    // 3. 处理连接出错
    connect(&websocketClient, &QWebSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error) {
        LOG() << "websocket 连接出错!" << error;
    });

    // 4. 处理收到文本消息
    connect(&websocketClient, &QWebSocket::textMessageReceived, this, [=](const QString& message) {
        LOG() << "websocket 收到文本消息!" << message;
    });

    // 5. 处理收到二进制消息
    connect(&websocketClient, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray) {
        LOG() << "websocket 收到二进制消息!" << byteArray.length();
        bite_im::NotifyMessage notifyMessage;
        notifyMessage.deserialize(&serializer, byteArray);
        handleWsResponse(notifyMessage);
    });

    // 和服务器真正建立连接
    websocketClient.open(WEBSOCKET_URL);
}

void network::NetClient::handleWsResponse(const bite_im::NotifyMessage &notifyMessage)
{

}

void network::NetClient::handleWsMessage(const model::Message &message)
{

}

void network::NetClient::handleWsRemoveFriend(const QString &userId)
{

}

void network::NetClient::handleWsAddFriendApply(const model::UserInfo &userInfo)
{

}

void network::NetClient::handleWsAddFriendProcess(const model::UserInfo &userInfo, bool agree)
{

}

void network::NetClient::handleWsSessionCreate(const model::ChatSessionInfo &chatSessionInfo)
{

}

// 发送身份认证
void network::NetClient::sendAuth()
{

}








